import axios from "axios";
import store from "@/store";
import { Toast } from "vant";
import router from "@/router";

//创建一个新的请求对象
const request = axios.create({
  baseURL: 'http://geek.itheima.net/'
})

// request.interceptors.request.use()
//请求拦截器，统一添加token
request.interceptors.request.use(config => {
  //需要判断有token才加请求头
  if (store.state.tokenObj.token) {
    config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
  }
  return config
}, err => {
  return Promise.reject(err)
})

//添加响应拦截器
request.interceptors.response.use(response => {
  //正常会影响的回调函数
  return response.data
},
  //响应出错的回调函数
  async error => {
    try {
      //error.config是本次请求失败的所有信息
      // console.dir('config', error.config)
      //请求响应里的errir对象里面reponse.status==401说明token过时了
      //token过时需要发送新请求得到token，继续存到vuex和本地存储里面
      //发送新请求的时候需要用到refresh_token去得到新的token
      // console.log(error.response.status)
      if (error.response.status == 401) {
        const res = await axios({
          url: 'http://geek.itheima.net/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
          }
        })
        // console.log(res.data.data.token)
        //调用store里面setToken的方法，把最新的token存起来，refresh_token还是用store原来的
        store.commit('changeToken', {
          token: res.data.data.token,
          refresh_token: store.state.tokenObj.refresh_token
        })


      }
      // return Promise.reject(error)
      //这句是无感刷新，最难理解
      return request(error.config)
    } catch {
      console.log('都失效了')
      Toast.fail('登录状态失效，请重新登录')
      router.push('/login')
    }
  })

//暴露出去
export default request